package parseutil
//
//import (
//	"bytes"
//	"fmt"
//	aster "github.com/szyhf/go-aster"
//	"html/template"
//	"io/ioutil"
//	_ "io/ioutil"
//	"log"
//	"strings"
//)
//
//func ParseWith(path string, inputStructName string) {
//	pkgs, err := aster.ParseDir(path, nil)
//	if err != nil {
//		panic(err)
//	}
//	for _, pkg := range pkgs {
//		//var pkgName = pkg.Name
//		//fmt.Println("pkg name =", pkgName)
//		models := pkg.Structs
//		for _, model := range models {
//			fmt.Println(model.Name)
//			if inputStructName == model.Name {
//				//fmt.Println(inputStructName,inputTableName)
//
//				generateRepo(model, pkg, path)
//			}
//			//generateRepo(model,pkg,path)
//		}
//	}
//}
//
//const tpl_content = `
//package {{ .packageName}}
//
//import (
//	"database/sql"
//	"fmt"
//)
//
//type (
//	{{.modelName}}Repo struct {
//		db *sql.DB
//	}
//)
//
//func (w *{{.modelName}}Repo) QueryById(input *{{.modelName}}) (u *{{.modelName}}, err error) {
//	var db = w.db
//	row := db.QueryRow(fmt.Sprintf("select {{.fields}} from %s where  %s = ?",input.TableName(),input.IdName()), input.ID())
//
//	u = &{{.modelName}}{}
//	_ = row.Scan({{.scanFields}})
//
//	return u, err
//}
//
//func (w *{{.modelName}}Repo) QueryAll( ) (res []*{{.modelName}}, err error) {
//	var db = w.db
//    qq := &{{.modelName}}{}
//	rows, err := db.Query(fmt.Sprintf("select {{.fields}}  from %s ",  qq.TableName()))
//	if err != nil {
//		return res, err
//	}
//	defer rows.Close()
//
//	for rows.Next() {
//		var u {{.modelName}}
//		_ = rows.Scan({{.scanFields}})
//		res = append(res, &u)
//	}
//	return res, err
//}
//
//func (w *{{.modelName}}Repo) DeleteById(input *{{.modelName}}) (int64, error) {
//	var db = w.db
//	exec, err := db.Exec(fmt.Sprintf("delete from %s where %s = ?",input.TableName(),input.IdName()), input.ID())
//	if err != nil {
//		return 0, err
//	}
//	cnt, err := exec.RowsAffected()
//	if err != nil {
//		return cnt, err
//	}
//	return cnt, err
//}
//func (w *{{.modelName}}Repo) UpdateById(u *{{.modelName}}) (int64, error) {
//	var db = w.db
//	exec, err := db.Exec(fmt.Sprintf("update %s  set {{.fseq}}  where %s = ?",u.TableName(),u.IdName() ), {{.scanFields}},u.ID())
//	if err != nil {
//		return 0, err
//	}
//
//	cnt, _ := exec.RowsAffected()
//	return cnt, nil
//}
//
//func (w *{{.modelName}}Repo) Insert(u *{{.modelName}}) error {
//	var db = w.db
//	exec,err := db.Exec(fmt.Sprintf("insert into %s ({{.fields}})values({{.question}})",u.TableName()),{{.scanFields}})
//    id, err := exec.LastInsertId()
//	u.SetLastInsertId(id)
//	return err
//}
//
//func (w *{{.modelName}}Repo) QueryCallback(sqlStr string, arg []interface{}, callback func(rows *sql.Rows) (*{{.modelName}}, error)) (res []*{{.modelName}}, err error) {
//	var db = w.db
//	rows, err := db.Query(sqlStr, arg...)
//	if err != nil {
//		return res, err
//	}
//	defer rows.Close()
//	for rows.Next() {
//		dept, err := callback(rows)
//		if err != nil {
//			return res, err
//		}
//		res = append(res, dept)
//	}
//	return res, err
//}
//
//
//
//`
//
//func generateRepo(model *aster.StructType, pkg *aster.PackageType, path string) {
//
//	var (
//		modelName string = model.Name
//		//tableName   string = inputTableName
//		fseq        string
//		scanFields  string
//		packageName string
//		fields      string
//		question    string
//	)
//	packageName = pkg.Name
//	var dbFields []string
//	var structFields []string
//	for _, f := range model.Fields {
//		dbname := f.Tag.Get("db")
//		if dbname == "" {
//			dbname = f.Name
//		}
//		dbFields = append(dbFields, dbname)
//		structFields = append(structFields, f.Name)
//
//	}
//	fields = strings.Join(dbFields, ",")
//	{
//		var arr []string
//		for _, f := range dbFields {
//			arr = append(arr, fmt.Sprintf("%s = ?", f))
//		}
//		fseq = strings.Join(arr, ",")
//		for i, v := range model.Fields {
//			name := v.Name
//			arr[i] = "&u." + name
//		}
//		scanFields = strings.Join(arr, ",")
//		//填充？？
//		for i, _ := range model.Fields {
//			arr[i] = "?"
//		}
//		question = strings.Join(arr, ",")
//	}
//
//	//var fileName = fmt.Sprintf("%s/%s_impl.go",path,modelName)
//	var err error
//	tpl, err := template.New("some").Parse(tpl_content)
//	//tpl, err := template.ParseFiles("./template/dao.tpl.bak")
//	if err != nil {
//		panic(err)
//	}
//
//	var fileName = fmt.Sprintf("%s/%s_impl.go", path, strings.ToLower(modelName))
//	fmt.Println("fileName ", fileName)
//	//f, err := os.OpenFile(fileName, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644)
//	//defer f.Close()
//	//if err != nil {
//	//	panic(err)
//	//}
//
//	var (
//		buf bytes.Buffer
//	)
//	//if packageName[0]>='A' && packageName[0]<='Z' {
//	//	var p0 = packageName[0] ^ 32
//	//	var s = []byte(packageName)
//	//	s[0] = p0
//	//	packageName = string(s)
//	//
//	//
//	//}
//	err = tpl.Execute(&buf, map[string]interface{}{
//		"modelName": modelName,
//		//"tableName":   tableName,
//		"fseq":        fseq,
//		"scanFields":  template.HTML(scanFields),
//		"packageName": packageName,
//		"fields":      fields,
//		"question":    question,
//	})
//	if err != nil {
//		log.Println(err)
//	}
//	//fmt.Println(buf.String())
//	//model.Methods[0].
//	// id
//	//fmt.Fprint(os.Stdout, buf.String())
//	ioutil.WriteFile(fileName, buf.Bytes(), 0644)
//	//ioutil.WriteFile(fileName,[]byte("afsa"),0640)
//}
